package com.example.role_based_permission_control.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @author 李云龙
 * @program: role_based_permmsion_control
 * @description: 增加一个拦截器来检查用户是否已登录
 * @date 2024-09-01 16:09:29
 */
@Slf4j
@Component
public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

//        request.getSession() 是用于获取当前请求的会话对象（HttpSession）的方法。
//        getSession() 方法有一个重载版本 getSession(boolean create)，其中参数 create 是一个布尔值，
//        用于指示如果当前请求没有关联的会话时，是否应该创建一个新的会话。
//        当 create 参数为 true 时，如果当前请求没有会话，则会创建一个新的会话并返回。
//        当 create 参数为 false 时，如果当前请求没有会话，则返回 null，而不是创建一个新的会话。
//        因此，HttpSession session = request.getSession(false); 这行代码的作用是尝试获取当前请求的会话对象，
//        但如果当前请求没有关联的会话，则不会创建新的会话，而是将 session 变量设置为 null。这通常用于检查用户是否已经登录，因为登录信息通常会存储在会话中。如果会话不存在（即 session 为 null），则可以认为用户未登录。
        HttpSession session = request.getSession(false);
        log.info("request.getRequestURL() = " + request.getRequestURL());

        // 如果是登录接口 放行
        if ("/login".equals(request.getRequestURI())) {
            return true;
        }
        // 检查 session 中是否存在用户信息，有表示登录过，放行
        if (session != null && session.getAttribute("user") != null) {
            return true;
        }
        // 其它情况 则拒绝访问
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        return false;
    }
}